//+------------------------------------------------------------------+
//|                                                       Series.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#include <Arrays/ArrayObj.mqh>
#include <Arrays/ArrayDouble.mqh>

//+------------------------------------------------------------------+
//| 默认缓冲区大小                                                   |
//+------------------------------------------------------------------+
#define DEFAULT_BUFFER_SIZE 1024

//+------------------------------------------------------------------+
//| 时间序列基类                                                     |
//| 用途：访问时间序列的基类                                         |
//|         继承自 CArrayObj 类                                     |
//+------------------------------------------------------------------+
class CSeries : public CArrayObj
{
protected:
   string            m_name;             // 序列名称
   int               m_buffers_total;    // 缓冲区数量
   int               m_buffer_size;      // 缓冲区大小
   int               m_timeframe_flags;  // 时间帧标志（类似于"对象可见性标志"）
   string            m_symbol;           // 交易品种
   ENUM_TIMEFRAMES   m_period;           // 时间周期
   bool              m_refresh_current;  // 刷新当前标志
   datetime          m_first_date;      // 首个日期

public:
   /** 构造函数 */
   CSeries(void);
   
   /** 析构函数 */
   ~CSeries(void);
   
   /** 获取序列名称 */
   string            Name(void) const;
   
   /** 获取缓冲区总数 */
   int               BuffersTotal(void) const;
   
   /** 获取缓冲区大小 */
   int               BufferSize(void) const;
   
   /** 获取时间帧标志 */
   int               Timeframe(void) const;
   
   /** 获取交易品种 */
   string            Symbol(void) const;
   
   /** 获取时间周期 */
   ENUM_TIMEFRAMES   Period(void) const;
   
   /**
    * 获取周期描述
    * @param val 周期值（可选，默认为0）
    * @return 周期描述字符串
    */
   string            PeriodDescription(const int val=0);
   
   /** 设置刷新当前标志 */
   void              RefreshCurrent(const bool flag);
   
   /**
    * 调整缓冲区大小
    * @param size 新的大小
    * @return 成功返回 true，失败返回 false
    */
   virtual bool      BufferResize(const int size);
   
   /**
    * 刷新数据
    * @param flags 刷新标志
    */
   virtual void      Refresh(const int flags);

protected:
   /**
    * 设置交易品种和时间周期
    * @param symbol 交易品种名称
    * @param period 时间周期
    * @return 成功返回 true，失败返回 false
    */
   bool              SetSymbolPeriod(const string symbol, const ENUM_TIMEFRAMES period);
   
   /**
    * 将周期转换为时间帧标志
    * @param period 时间周期
    */
   void              PeriodToTimeframeFlag(const ENUM_TIMEFRAMES period);
   
   /**
    * 检查并加载历史数据
    * @param size 需要的数据大小
    * @return 成功返回 true，失败返回 false
    */
   bool              CheckLoadHistory(const int size);
   
   /**
    * 检查终端历史数据
    * @param size 需要的数据大小
    * @return 成功返回 true，失败返回 false
    */
   bool              CheckTerminalHistory(const int size);
   
   /**
    * 检查服务器历史数据
    * @param size 需要的数据大小
    * @return 成功返回 true，失败返回 false
    */
   bool              CheckServerHistory(const int size);
};

//+------------------------------------------------------------------+
//| 双精度缓冲区类                                                   |
//| 用途：双精度类型数据缓冲区基类                                   |
//|         继承自 CArrayDouble 类                                   |
//+------------------------------------------------------------------+
class CDoubleBuffer : public CArrayDouble
{
protected:
   string            m_symbol;           // 交易品种
   ENUM_TIMEFRAMES   m_period;            // 时间周期
   int               m_size;              // 使用的历史数据大小

public:
   /** 构造函数 */
   CDoubleBuffer(void);
   
   /** 析构函数 */
   ~CDoubleBuffer(void);
   
   /** 设置缓冲区大小 */
   void              Size(const int size);
   
   /**
    * 访问指定位置的数据
    * @param index 索引位置
    * @return 数据值
    */
   double            At(const int index) const;
   
   /** 刷新缓冲区数据 */
   virtual bool      Refresh(void);
   
   /** 刷新当前缓冲区数据 */
   virtual bool      RefreshCurrent(void);
   
   /**
    * 设置交易品种和时间周期
    * @param symbol 交易品种名称
    * @param period 时间周期
    */
   void              SetSymbolPeriod(const string symbol, const ENUM_TIMEFRAMES period);
};
//+------------------------------------------------------------------+